/*
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * openUBMC is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *         http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#include <mc/dict.h>
#include <mc/variant.h>
#include <mc/log.h>
#include <mctp/mctp.h>

#include "pldm_over_mctp.h"

namespace dev {

pldm_over_mctp::pldm_over_mctp(mctp& mctp_obj) : m_mctp(mctp_obj) {
}

bool pldm_over_mctp::request(mc::dict ctx, std::vector<uint8_t> data, std::string& rsp) {
    if (ctx.empty()) {
        return false;
    }
    if (!ctx.contains("PldmType") || !ctx.contains("CommandCode")) {
        return false;
    }

    std::string data_hex;
    for (const auto& byte : data) {
        char buf[4];
        snprintf(buf, sizeof(buf), "%02X ", byte);
        data_hex += buf;
    }
    
    ilog("PLDM MCTP Request - PldmType: ${pldm_type}, CommandCode: ${cmd_code}, Data[${size}]: ${data}",
         ("pldm_type", static_cast<int>(ctx["PldmType"].as<uint8_t>()))
         ("cmd_code", static_cast<int>(ctx["CommandCode"].as<uint8_t>()))
         ("size", data.size())
         ("data", data_hex));

    bool ret = m_mctp.request(ctx, data, 0, rsp);
    if (!ret) {
        return false;
    }

    std::string rsp_hex;
    for (size_t i = 0; i < rsp.size(); ++i) {
        char buf[4];
        snprintf(buf, sizeof(buf), "%02X ", static_cast<uint8_t>(rsp[i]));
        rsp_hex += buf;
    }
    
    ilog("PLDM MCTP Response - Size: ${size}, Data: ${data}",
         ("size", rsp.size())
         ("data", rsp_hex));
    return true;
}

} // namespace dev